package controllers.GestionDataHistorica;

import models.Hidcomponente;
import models.Hidpuntomonitoreo;
import models.Hidtipocomponente;
import models.Hidregistro;
import models.Hidtipomedicion;
import play.mvc.Controller;
import java.util.*;
import java.io.File;
/**
 * Created with IntelliJ IDEA.
 * User: Daniel
 * Date: 27/12/12
 * Time: 12:28 PM
 * To change this template use File | Settings | File Templates.
 */
public class GestorDataHistorica extends Controller{

    public static void index(int id)
    {
        // Código del modelo de cuenca.
        int idmodelo = id;
        // Código de los nodos padre del arbol de componentes hidráulicos.
        int nodoid =1;
        // Código de los nodos hijo del arbol de componentes hidráulicos.
        int nodoidpcom =0;
        // Código de los tipos de medición del componente hidráulico.
        int nodoidptipmed =0;
        //  Lista componentes del arbol de componentes hidráulicos.
        //  El contenido de los elementos de la lista son : "nodeId | parentNodeId | nodeName | nodeUrl" .
        List <String> arbcomps = new ArrayList<String>();
        // Elemento del arbol de componentes hidráulicos.
        String arbcompsele;
        // Lista de todos los componentes hidráulicos aptos para modelar una cuenca.
        List <Hidtipocomponente> modtipcomps = Hidtipocomponente.findAll();
        Iterator itrmodtipcomps = modtipcomps.iterator();
        // Llenado de los elementos del arbol de componentes hidráulicos.
        while (itrmodtipcomps.hasNext())
        {
            Hidtipocomponente modtipcompsele = (Hidtipocomponente)itrmodtipcomps.next();
            // nodeId | parentNodeId | nodeName | nodeUrl.
            arbcompsele = nodoid+"|"+"0|"+modtipcompsele.getTipcompnom().trim()+"|#";
            arbcomps.add(arbcompsele);
            nodoid++;
            arbcompsele ="";
            nodoidpcom =nodoid-1;
            List <Hidcomponente> modcomps = Hidcomponente.find("byModsimidAndTipcompid",idmodelo,modtipcompsele.getTipcompid()).fetch();
            Iterator itrmodcomps = modcomps.iterator();
            while (itrmodcomps.hasNext())
            {
                Hidcomponente modcompsele = (Hidcomponente)itrmodcomps.next();
                //System.out.println("          "+modcompsele.getCompnom());
                arbcompsele = nodoid+"|"+nodoidpcom+"|"+modcompsele.getCompnom().trim()+"|#";
                arbcomps.add(arbcompsele);
                nodoid++;
                arbcompsele ="";
                nodoidptipmed =nodoid-1;
                List <Hidpuntomonitoreo> modcompunmons = Hidpuntomonitoreo.find("byCompid",modcompsele.getCompid()).fetch();
                Iterator itrmodcompunmons = modcompunmons.iterator();
                while (itrmodcompunmons.hasNext())
                {
                    Hidpuntomonitoreo modcompunmonsele = (Hidpuntomonitoreo)itrmodcompunmons.next();
                    List<Hidtipomedicion> modcomptipmeds = modcompunmonsele.getHidtipopuntomonitoreo().getHidtipomedicions();
                    Iterator itrmodcomptipmeds = modcomptipmeds.iterator();
                    while (itrmodcomptipmeds.hasNext())
                    {
                        Hidtipomedicion modcomptipmedsele = (Hidtipomedicion)itrmodcomptipmeds.next();

                        arbcompsele = nodoid+"|"+nodoidptipmed+"|"+modcomptipmedsele.getTipmednom().trim()+"|#"+modcomptipmedsele.getTipmedid();
                        arbcomps.add(arbcompsele);
                        nodoid++;
                        arbcompsele ="";
                    }
                }
            }
        }
        //Iterator  itrarbcomps = arbcomps.iterator();
        //while (itrarbcomps.hasNext())
        //{
        //    String itrarbcompsele = (String)itrarbcomps.next();
        //    System.out.println(itrarbcompsele);
        //}
        // Lista de todos los componentes presentes en el modelo de cuenca de "idmodelo".
        List <Hidcomponente> componentesmod = Hidcomponente.find("byModsimid",idmodelo).fetch();
        render(idmodelo,componentesmod,arbcomps);
    }

    public static void registros(int idRegistro, String errorRegistro,int idCompModSim, int idtipmedicion)
    {
        String errorsRegistro;
        List <Hidtipomedicion> compstipmeds = new ArrayList<Hidtipomedicion>();
        if(errorRegistro != null)
        {
            errorsRegistro = errorRegistro;
        }
        else
        {
            errorsRegistro = "";
        }
        Hidregistro hidregistro = Hidregistro.findById(idRegistro);
        Hidcomponente hidcomponente = Hidcomponente.findById(idCompModSim);
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byCompid",hidcomponente.getCompid()).first();
        List<Hidtipomedicion> modcompotipmeds = hidpuntomonitoreo.getHidtipopuntomonitoreo().getHidtipomedicions();
        Iterator  itrmodcompotipmeds = modcompotipmeds.iterator();
        while (itrmodcompotipmeds.hasNext())
        {
            Hidtipomedicion itrmodcompotipmedsele = (Hidtipomedicion)itrmodcompotipmeds.next();
            if (idtipmedicion == 0)
                compstipmeds.add(itrmodcompotipmedsele);
            else
            if (itrmodcompotipmedsele.getTipmedid()==idtipmedicion)
                compstipmeds.add(itrmodcompotipmedsele);
        }
        render(hidcomponente,hidpuntomonitoreo, hidregistro, errorsRegistro, idtipmedicion, compstipmeds);
    }

    public static void EditarRegistro(int idRegistro, int idCompModSim, int idtipmedicion)
    {
        registros(idRegistro,"",idCompModSim, idtipmedicion);
    }
    public static void EliminarRegistro(int idRegistro, int idCompModSim, int idtipmedicion)
    {
        Hidregistro hidregistro = Hidregistro.findById(idRegistro);
        hidregistro.delete();
        registros(idRegistro, "",idCompModSim,idtipmedicion);
    }
    public static void CrearRegistro(Hidregistro registro, int horas, int minutos, int segundos, int idCompModSim, int idtipmedicion)
    {
        registro.getRegfech().setHours(horas);
        registro.getRegfech().setMinutes(minutos);
        registro.getRegfech().setSeconds(segundos);
        try{
            registro.save();
            registros(0, "", idCompModSim,idtipmedicion);
        }
        catch (Exception e)
        {
            String errorRegistro = ErrorRegistro.ERROR_DUPLICIDAD_REGISTRO;
            registros(0, errorRegistro, idCompModSim,idtipmedicion);
        }
    }
    public static void CargarRegistrosExcel(String ruta,  int idCompModSim, int idtipmedicion)
    {
        GestorExcelRegistros gestorExcelRegistros = new GestorExcelRegistros();
        gestorExcelRegistros.ExtraerRegistrosExcel(ruta);

        if(gestorExcelRegistros.errores.size() == 0)
        {
            registros(0, "", idCompModSim,idtipmedicion);
        }
        else
        {
            List<ErrorRegistro> errores = gestorExcelRegistros.errores;
            render(errores);
        }
    }
    public static void prueba(File file){
        System.out.println("Uploaded file name " + file.getName());
    }
}
